package com.ruoyi.learn.java.algorithm.dp;

/**
 * 4. 0-1 背包问题（0-1 Knapsack）
 * 问题：有 n 个物品，每个物品有重量 w[i] 和价值 v[i]，背包容量为 W，每件物品只能选一次，求最大价值。
 */
public class Knapsack {
    public static int knapsack(int[] weights, int[] values, int W) {
        int n = weights.length;
        int[][] dp = new int[n + 1][W + 1];

        for (int i = 1; i <= n; i++) {
            for (int w = 0; w <= W; w++) {
                if (weights[i - 1] <= w) {
                    dp[i][w] = Math.max(
                            dp[i - 1][w], // 不选
                            dp[i - 1][w - weights[i - 1]] + values[i - 1] // 选
                    );
                } else {
                    dp[i][w] = dp[i - 1][w];
                }
            }
        }
        return dp[n][W];
    }

    public static void main(String[] args) {
        int[] weights = {2, 3, 4, 5};
        int[] values = {3, 4, 5, 6};
        int W = 8;
        System.out.println(knapsack(weights, values, W)); // 输出: 10
    }
}
